iT邦幫忙

2023 iThome 鐵人賽

DAY 4
1
SideProject30

一起成為新世紀文字藝術師:深入玩轉 Unicode 和 OpenType系列 第 4

DAY 04|字元集的難題:在 Unicode 之前

  • 分享至 

  • xImage
  •  

除了昨天介紹的格式之外,字型的基礎就是「字」。

對人類來說,字就是字,不需要特別約定;但在僅以 0 與 1 儲存的電腦上,我們輸入的文字都會被編碼(encoding)成二進位。假如我們今天要傳訊息給別人,接收方要如何將這些二進位的訊號解碼(decoding)回原本的意思呢?

很直觀的想法是,我們可以透過「字符與代碼映射關係」的小冊子,如同查閱雙語字典一般,在傳送方進行編碼時,可以先找尋文本與對應的代碼;而接受方在收到代號後,也能夠回頭查詢與代碼相對應的文本。

這樣的小冊子就是「字元集(character set)」。

在電腦剛誕生的時候,資訊交換的必要性極低。但在大型商業電腦與通用作業系統的出現後,電腦不再只是一台計算機,隨著各種應用程式落地發展,我們開始需要和陌生人交換資訊——但大家手上的小冊子都不一樣呀,要怎麼讓雙方都能無歧意的交換訊息?

此時,人們意識到,我們需要一本共用的小冊子。

EBCDIC

1964 年,作為當時電腦業界的老大,IBM 推出了 EBCDIC(Extended Binary Coded Decimal Interchange Code,擴展二進位編碼的十進位交換碼)解決方案,替一些常用的字母映射(mapping)到獨一無二的碼位(code point)上。

還記得我們昨天提到的,第一台擁有終端顯示器的 IBM 2260 商用電腦嗎?他使用的字元集就是 EBCDIC。

在最初的版本裡,EBCDIC 包含了控制字元(control character)、符號、數字、以及大小寫英文在內等字元。可惜的是,EBCDIC 在規劃時並沒有把英文放在連續的相鄰位置,這給程式處理帶來一定程度的麻煩。

ASCII

四年後的 1968 年,ANSI(American National Standard Institute,美國國家標準學會)在檢討 EBCDIC 的優點與缺點後,發布了 ASCII(American Standard Code for Information Interchange,美國訊息交換標準碼)方案。

和 EBCDIC 最大的不同就在於,ASCII 將英文大小寫放在連續位置上,極大方便了程式的處理。舉例來說,如果要將大小寫轉換,可以簡單的對 ASCII 索引值加減 32 來進行轉換,但 EBCDIC 就必須考慮到字符中間不連續的狀態。

# 一個簡單的大小寫轉換方法
def changeCase(string):
    result = ""
    for word in string:
        if word >= "A" and word <= "Z":
            result += chr(ord(word) + 32)
        elif word >= "a" and word <= "z":
            result += chr(ord(word) - 32)
        else:
            result += word
    return result
    
print(changeCase("Hello, World!")) 
#hELLO, wORLD!

》Image Source: Wikipedia

考慮到字符的數量,ASCII 僅用了七位的 bit 來紀錄字元,同時保留最高的 bit (b8) 用作校驗位(check bit),預留為 0。舉例來說,大寫 A0100 0001,換成十進位也就是 65

將每種二進位的組合對應一個字符——共有 2^7=128(編號 0-127)種組合——這 128 個「格子」對美國人使用的英文來說,已經足夠放下所有需要的字母和符號。但如果要紀錄歐洲的其他的語言,例如有 é 的法文(像是 café)怎麼辦?

很快地,廠商就把腦筋動到了還沒有使用到的最高位 bit——只要把這一位改成 1,就可以再額外「擴充」出另外 128 個格子出來放這些字母。可以說,只要該書寫系統的字母少於 256 (2^8) 個,便能透過 ASCII 擴充。

例如 IBM 為西歐國家的拉丁文字擴充的 Code page 437 標準、為希臘文字擴充的 Code page 737、為波羅的海三小國文字擴充的 Code page 775、為中歐國家所需的拉丁文字擴充的 Code page 852、為西里爾文字擴充的 Code page 855 等等。

很快地,ASCII 成為歐美最通用的標準,在歷經數十年的推廣與擴充後,ASCII 已經可以藉由「擴充」的方式囊括所有歐洲文字所需的字符。

但透過這種權宜之計依舊會遇到跨國的交換問題——如果我跟你的擴充標準不一樣,對應的字符就會不同,「亂碼」就出現了。此外,當 1980 年代電腦登陸東亞市場,面對動輒數千、甚至數萬的漢字又要怎麼處理?

於是,東亞各國的電腦廠家便自行增加 Byte 數量來進行擴充,例如日本制定了自己國內的工業標準 Shift JIS、中國則制定了 GB2312,台灣則有由資策會的 Big5。

編碼解決方案 用多少 Byte 來表示一個「字」
EBCDIC 1 Byte
ASCII 1 Byte
Shift JIS(日本工業標準) 2 Byte
GB2312(中華人民共和國國家標準) 2 Byte
Big 5(大五碼) 2 Byte

本來想要終結分裂的 ASCII,卻因其擴充性不佳,反而帶來了新的混亂。

或許,是時候想個辦法來一統天下了。

Recap

  • 電腦只認得二進位,要想讓他認得「字」,需要建立字元集,將字符與編碼進行一對一的映射。
  • EBCDIC 做了初步的嘗試,但因為一些設計上的瑕疵失敗了;而吸收了教訓的 ASCII 方案成功了。
  • 透過 ASCII 方案,至多可以放入 256 個不同的字符,這對於歐文來說已經足夠。但想放入其他文字——如漢字——是不可能的,於是各個廠商又在 ASCII 的基礎上做了不同的擴充集,反而又造成了更多的分歧。

上一篇
DAY 03|數位字型的進程:OpenType 格式
下一篇
DAY 05|Unicode 的統一與原則
系列文
一起成為新世紀文字藝術師:深入玩轉 Unicode 和 OpenType30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言